package com.ylbh.modules.member.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ylbh.common.pojo.business.dto.BusinessPicDTO;
import com.ylbh.common.pojo.member.dto.*;
import com.ylbh.common.pojo.member.dto.select.ExtractMoneyDetailSelectDTO;
import com.ylbh.common.pojo.member.dto.select.MemberSelectDTO;
import com.ylbh.common.pojo.member.dto.select.MerchantIncomeSelectDTO;
import com.ylbh.common.pojo.member.dto.update.MemberUpdateDTO;
import com.ylbh.common.pojo.member.vo.*;
import com.ylbh.common.utils.PageDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;

/**
 *
 *
 * @author ${author}
 * @email ${email}
 * @date 2019-04-15 15:35:45
 */
@Mapper
@Repository
public interface MemberMapper extends BaseMapper<MemberDTO> {
    /**
     * 查询会员数据列表
     * @param params
     * @return
     */
    List<MemberVO> selectMemberList(@Param(value = "params") MemberSelectDTO params, Page page);

    /**
     * 查询会员总数
     * @param params
     * @return
     */
    Integer getMemberUserCount(MemberSelectDTO params);

    /**
     * 通过id获取用户信息
     * @param userId
     * @return
     */
    MemberVO getByUserId(@Param("userId") Long userId);

    MemberUserTypeVO selectTopLevel(Integer id);

    /**
     * 修改用户类型
     * @param user
     * @return
     */
    void updateByUserId(@Param("user") MemberDTO user);

    /**
     * 插入升级数据
     * @param upgradeDTO
     */
    void saveUpgrade(@Param("upgradeDTO") MemberUpgradeDTO upgradeDTO);

    /**
     * 提现明细列表
     * @param params
     * @return
     */
    List<BusinessWithRecordVO> selectBusinessWithRecordList(ExtractMoneyDetailSelectDTO params);

    /**
     * 提现明细总数
     * @param params
     * @return
     */
    int queryBusinessWithRecordCount(ExtractMoneyDetailSelectDTO params);

    /**
     * 获取商户收益列表
     * @param params
     * @return
     */
    List<MerchantIncomeDTO> selectMerchantIncomeList(@Param(value = "params") MerchantIncomeSelectDTO params, Page page);

    /**
     * 获取商户收益列表总数
     * @param params
     * @return
     */
    int getMerchantIncomeCount(MerchantIncomeSelectDTO params);

    /**
     * 汇总商户总金额
     * @param id
     * @return
     */
    BigDecimal sumMerchantIncomeMoney(@Param("withUserId") Long id);

    /**
     * 汇总商户推广提现未提现余额
     * @param id
     * @return
     */
    HashMap<String, BigDecimal> sumMerchantExtensionMoney(@Param("withUserId") Long id);

    /**
     * 通过用户名获取用户
      * @param name
     * @return
     */
    MemberVO getByUserName(@Param("name")String name);

    /**
     * 运营商总数
     * @param params
     * @return
     */
    int getOperatorUserCount(PageDTO params);

    /**
     * 运营商列表
     * @param params
     * @param page
     * @return
     */
    List<OperatorVO> selectOperatorList(@Param(value = "params") PageDTO params, Page<Object> page);

    /**
     * 修改用户信息
     * @param memberUpdateDTO
     */
    void updateById(MemberUpdateDTO memberUpdateDTO);

    /**
     * 导出会员详情
     * @param userType
     */
    List<UserExcelVO> selectUserExcel(@Param(value = "userType") String userType, @Param(value = "keywords") String keywords, @Param(value = "province") String province,
                                      @Param(value = "city") String city, @Param(value = "town") String town, @Param(value = "startTime") String startTime, @Param(value = "endTime") String endTime);

    // 修改用户主图
    void updateUserByPhotoId(@Param(value = "memberDTO") MemberDTO memberDTO);

    /**
     * 新增运营商
     * @param addOperatorDTO
     */
    void insertOperator(@Param(value = "addOperatorDTO") AddOperatorDTO addOperatorDTO);

    /**
     * 新增运营商增加记录
     * @param addOperatorDTO
     */
    void insertSysFhLog(@Param(value = "addOperatorDTO") AddOperatorDTO addOperatorDTO);

    /**
     * 修改购物劵
      * @param id
     * @param integral
     */
    void updateUserIntegralById(Long id, Integer integral);

    /**
     * 会员关系
     * @param dto
     * @param page
     * @return
     */
    List<MembershipVO> selectMembership(@Param(value = "dto") MembershipDTO dto, Page page);

    /**
     * 查询修改用户的状态
     * @param id
     * @return
     */
    int selectStatusById(Long id);

    /**
     * 查询授权
     * @param id
     * @return
     */
    String selectAuthByUserId(Long id);

    /**
     * 先去查询用户原有的类型
     * @param userId
     * @return
     */
    int selectUserTypeByUserId(Integer userId);

    /**
     * 查询上级的用户类型
     * @param userId
     * @return
     */
    MemberVO selectSuperiorUserTypeByUserId(Integer userId);

    /**
     * 修改用户类型并更换上级用户
     * @param vo
     */
    void updateUserTypeOrParentIdByUserId(MemberVO vo);

    void updateUserTypeByUserId(MemberVO vo);

    /**
     * 获取运营商是否添加过
     * @param userName
     * @return
     */
    int selectIsExistenceByUserName(String userName);

    /**
     * 获取所有的运营商
     * @return
     */
    List<MemberVO> selectAllOperator();

    /**
     * 根据上级id和类型查询用户
     * @param userId
     * @param upgradeUserType
     * @return
     */
    List<MemberVO> selectSubordinateUserByIdAndType(Integer userId, @Param(value = "upgradeUserType") List<Integer> upgradeUserType);

    /**
     * 根据上级id查询用户
     * @param userId
     * @return
     */
    List<MemberVO> selectSubordinateUserById(Integer userId);

    /**
     * 根据id查询当前用户上级
     * @param userId
     * @return
     */
    int selectModifyUserParentId(Integer userId);

    /**
     * 替换上级
     * @param subordinateUser
     * @param modifyUserParentId
     */
    void updateSuperior(@Param(value = "subordinateUser") List<MemberVO> subordinateUser, int modifyUserParentId);

    /**
     * 查询出所有的合伙人
     * @return
     */
    List<MemberVO> selectAllPartnerList();
}
